package com.zzyl.service.impl;

import cn.hutool.core.date.LocalDateTimeUtil;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.zzyl.base.PageResponse;
import com.zzyl.dto.DeviceServiceDataPageQueryDto;
import com.zzyl.mapper.DeviceDataMapper;
import com.zzyl.service.DeviceDataService;
import com.zzyl.utils.ObjectUtil;
import com.zzyl.vo.DeviceDataGraphVo;
import com.zzyl.vo.DeviceDataVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * @Description DeviceDataServiceImpl
 * @Author Bafeii7
 * @Date 2025-05-22 16:59
 */
@Service
public class DeviceDataServiceImpl implements DeviceDataService {

    @Autowired
    private DeviceDataMapper deviceDataMapper;

    @Override
    public PageResponse<DeviceDataVo> pageQueryDeviceData(DeviceServiceDataPageQueryDto pageQueryDto) {
        // 设置分页助手参数
        PageHelper.startPage(pageQueryDto.getPageNum(), pageQueryDto.getPageSize());
        //前端传递的时间是一个long类型的毫秒值，作为条件查询数据库需要转换为日期类型
        Long startTime = pageQueryDto.getStartTime();
        Long endTime = pageQueryDto.getEndTime();
        pageQueryDto.setStartDate(ObjectUtil.isEmpty(startTime) ? null : LocalDateTimeUtil.of(startTime));
        pageQueryDto.setEndDate(ObjectUtil.isEmpty(endTime) ? null : LocalDateTimeUtil.of(endTime));
        // 查询封装
        Page<DeviceDataVo> page = deviceDataMapper.pageQueryDeviceData(pageQueryDto);
        return PageResponse.of(page, DeviceDataVo.class);
    }

    @Override
    public List<DeviceDataGraphVo> queryDeviceDataListByDay(String iotId, String functionId, String endTime, String startTime) {
        // 将时间戳endTime，startTime转化为2025-05-22 10:58:05这种格式
        LocalDateTime start = LocalDateTimeUtil.of(Long.parseLong(startTime));
        LocalDateTime end = LocalDateTimeUtil.of(Long.parseLong(endTime));
       /* List<DeviceDataGraphVo> tempList = DeviceDataGraphVo.dayInstance(start);
        // 调用数据库查数据
        List<Map<String, Object>> dbData = deviceDataMapper.queryDeviceDataListByDay(iotId,functionId,end,start);
        // 将获得的数据进行遍历判断，如果当前时间段没有数据则设置为0
        tempList.forEach(item -> {
            // 如果dbData的Key被item包含，则将dbData的value赋给item
            dbData.forEach(dbItem -> {
                if (item.getDateTime().contains(dbItem.get("date_time").toString())){
                    item.setDataValue((Double) dbItem.get("data_value"));
                }
            });
        });*/
        List<DeviceDataGraphVo> vos = new ArrayList<>();
        List<Map<String, Object>> maps = deviceDataMapper.queryDeviceDataListByDay(iotId, functionId, end, start);
        // 创建一个循环，从0开始，一直到23结束，每次加1
        for (int i = 0; i < 23; i++) {
            // 创建一个新日期，从0:00开始，每次加1小时
            LocalDateTime time = start.plusHours(i);
            DeviceDataGraphVo vo = new DeviceDataGraphVo();
            vo.setDateTime(time.format(DateTimeFormatter.ofPattern("HH:mm")));
            vo.setDataValue(0.0); // 默认值
            vos.add(vo);
        }
        // 遍历集合，挨个判断，如果在某个时间段有值，则将这个时间段的值重新赋值
        for (Map<String, Object> map : maps) {
            // 获取时间
            String time = map.get("date_time").toString();
            // 获取值
            Double value = (Double) map.get("data_value");
            // 遍历集合，挨个判断，如果在某个时间段有值，则将这个时间段的值重新赋值
            for (DeviceDataGraphVo vo : vos) {
                if (time.contains(vo.getDateTime())) {
                    vo.setDataValue(value);
                }
            }
        }
        // 封装返回的数据
        return vos;
    }

    @Override
    public List<DeviceDataGraphVo> queryDeviceDataListByWeek(String iotId, String functionId, String endTime, String startTime) {
        // 将时间戳endTime，startTime转化为2025-05-22 10:58:05这种格式
        LocalDateTime start = LocalDateTimeUtil.of(Long.parseLong(startTime));
        LocalDateTime end = LocalDateTimeUtil.of(Long.parseLong(endTime));

        // 存放遍历的7天数据
        List<DeviceDataGraphVo> vos = new ArrayList<>();
        // 从start 到 end，创建一个循环，每次加1天
        for (LocalDateTime time = start; time.isBefore(end); time = time.plusDays(1)) {
            DeviceDataGraphVo vo = new DeviceDataGraphVo();
            // 初始日期为x月x日，格式为MM.dd
            vo.setDateTime(time.format(DateTimeFormatter.ofPattern("MM.dd")));
            // 初始值设为0
            vo.setDataValue(0.0);
            // 添加进集合中
            vos.add(vo);
        }
        // 查询数据库，获得一个Map集合
        List<Map<String, Object>> maps = deviceDataMapper.queryDeviceDataListByWeek(iotId, functionId, end, start);
        // 遍历查询数据库获得的集合
            // 如果查询数据库获得的集合不为空，则遍历vos，挨个判断，如果在某个日期有值，则将这个日期的值重新赋值
        for (Map<String, Object> map : maps) {
            // 获取时间
            String time = map.get("date_time").toString();
            // 获取值
            Double value = (Double) map.get("data_value");
            // 遍历集合，挨个判断，如果在某个时间段有值，则将这个时间段的值重新赋值
            for (DeviceDataGraphVo vo : vos) {
                if (time.contains(vo.getDateTime())) {
                    vo.setDataValue(value);
                }
            }
        }
        return vos;
    }
}
